From ec2ce26d82b61afb962c2eb38c79843a226ed9d8 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Timm=20B=C3=A4der?= Date: Sun, 5 Feb 2017 09:21:56 +0100 Subject: [PATCH] colorbutton: Inherit from GtkWidget --- gtk/gtkcolorbutton.c | 81 ++++++++++++++++++++++++++++++++++++-------- gtk/gtkcolorbutton.h | 4 +-- 2 files changed, 68 insertions(+), 17 deletions(-) diff --git a/gtk/gtkcolorbutton.c b/gtk/gtkcolorbutton.c index 691ae7ac01..8c1aa29a11 100644 --- a/gtk/gtkcolorbutton.c +++ b/gtk/gtkcolorbutton.c @@ -63,6 +63,8 @@ struct _GtkColorButtonPrivate { + GtkWidget *button; + GtkWidget *swatch; /* Widget where we draw the color sample */ GtkWidget *cs_dialog; /* Color selection dialog */ @@ -102,7 +104,8 @@ static void gtk_color_button_get_property (GObject *object, GParamSpec *pspec); /* gtkbutton signals */ -static void gtk_color_button_clicked (GtkButton *button); +static void gtk_color_button_clicked (GtkButton *button, + gpointer user_data); /* source side drag signals */ static void gtk_color_button_drag_begin (GtkWidget *widget, @@ -132,24 +135,64 @@ static const GtkTargetEntry drop_types[] = { { (char *) "application/x-color", 0 static void gtk_color_button_iface_init (GtkColorChooserInterface *iface); -G_DEFINE_TYPE_WITH_CODE (GtkColorButton, gtk_color_button, GTK_TYPE_BUTTON, +G_DEFINE_TYPE_WITH_CODE (GtkColorButton, gtk_color_button, GTK_TYPE_WIDGET, G_ADD_PRIVATE (GtkColorButton) G_IMPLEMENT_INTERFACE (GTK_TYPE_COLOR_CHOOSER, gtk_color_button_iface_init)) +static void +gtk_color_button_measure (GtkWidget *widget, + GtkOrientation orientation, + int for_size, + int *minimum, + int *natural, + int *minimum_baseline, + int *natural_baseline) +{ + GtkColorButton *button = GTK_COLOR_BUTTON (widget); + GtkColorButtonPrivate *priv = gtk_color_button_get_instance_private (button); + + gtk_widget_measure (priv->button, orientation, for_size, + minimum, natural, + minimum_baseline, natural_baseline); +} + +static void +gtk_color_button_snapshot (GtkWidget *widget, + GtkSnapshot *snapshot) +{ + GtkColorButton *button = GTK_COLOR_BUTTON (widget); + GtkColorButtonPrivate *priv = gtk_color_button_get_instance_private (button); + + gtk_widget_snapshot_child (widget, priv->button, snapshot); +} + +static void +gtk_color_button_size_allocate (GtkWidget *widget, + GtkAllocation *allocation) +{ + GtkColorButton *button = GTK_COLOR_BUTTON (widget); + GtkColorButtonPrivate *priv = gtk_color_button_get_instance_private (button); + + gtk_widget_size_allocate (priv->button, allocation); +} + static void gtk_color_button_class_init (GtkColorButtonClass *klass) { GObjectClass *gobject_class; - GtkButtonClass *button_class; + GtkWidgetClass *widget_class; gobject_class = G_OBJECT_CLASS (klass); - button_class = GTK_BUTTON_CLASS (klass); + widget_class = GTK_WIDGET_CLASS (klass); gobject_class->get_property = gtk_color_button_get_property; gobject_class->set_property = gtk_color_button_set_property; gobject_class->finalize = gtk_color_button_finalize; - button_class->clicked = gtk_color_button_clicked; + + widget_class->snapshot = gtk_color_button_snapshot; + widget_class->measure = gtk_color_button_measure; + widget_class->size_allocate = gtk_color_button_size_allocate; klass->color_set = NULL; /** @@ -288,7 +331,7 @@ gtk_color_button_drag_data_received (GtkWidget *widget, static void set_color_icon (GdkDragContext *context, - GdkRGBA *rgba) + const GdkRGBA *rgba) { cairo_surface_t *surface; cairo_t *cr; @@ -344,9 +387,15 @@ gtk_color_button_init (GtkColorButton *button) PangoRectangle rect; GtkStyleContext *context; + gtk_widget_set_has_window (GTK_WIDGET (button), FALSE); + /* Create the widgets */ priv = button->priv = gtk_color_button_get_instance_private (button); + priv->button = gtk_button_new (); + g_signal_connect (priv->button, "clicked", G_CALLBACK (gtk_color_button_clicked), button); + gtk_widget_set_parent (priv->button, GTK_WIDGET (button)); + priv->swatch = gtk_color_swatch_new (); layout = gtk_widget_create_pango_layout (GTK_WIDGET (button), "Black"); pango_layout_get_pixel_extents (layout, NULL, &rect); @@ -354,7 +403,7 @@ gtk_color_button_init (GtkColorButton *button) gtk_widget_set_size_request (priv->swatch, rect.width, rect.height); - gtk_container_add (GTK_CONTAINER (button), priv->swatch); + gtk_container_add (GTK_CONTAINER (priv->button), priv->swatch); button->priv->title = g_strdup (_("Pick a Color")); /* default title */ @@ -365,23 +414,23 @@ gtk_color_button_init (GtkColorButton *button) priv->rgba.alpha = 1; priv->use_alpha = FALSE; - gtk_drag_dest_set (GTK_WIDGET (button), + gtk_drag_dest_set (priv->button, GTK_DEST_DEFAULT_MOTION | GTK_DEST_DEFAULT_HIGHLIGHT | GTK_DEST_DEFAULT_DROP, drop_types, 1, GDK_ACTION_COPY); - gtk_drag_source_set (GTK_WIDGET (button), + gtk_drag_source_set (priv->button, GDK_BUTTON1_MASK|GDK_BUTTON3_MASK, drop_types, 1, GDK_ACTION_COPY); - g_signal_connect (button, "drag-begin", + g_signal_connect (priv->button, "drag-begin", G_CALLBACK (gtk_color_button_drag_begin), button); - g_signal_connect (button, "drag-data-received", + g_signal_connect (priv->button, "drag-data-received", G_CALLBACK (gtk_color_button_drag_data_received), button); - g_signal_connect (button, "drag-data-get", + g_signal_connect (priv->button, "drag-data-get", G_CALLBACK (gtk_color_button_drag_data_get), button); - context = gtk_widget_get_style_context (GTK_WIDGET (button)); + context = gtk_widget_get_style_context (GTK_WIDGET (priv->button)); gtk_style_context_add_class (context, "color"); } @@ -395,6 +444,7 @@ gtk_color_button_finalize (GObject *object) gtk_widget_destroy (priv->cs_dialog); g_free (priv->title); + gtk_widget_unparent (priv->button); G_OBJECT_CLASS (gtk_color_button_parent_class)->finalize (object); } @@ -506,9 +556,10 @@ ensure_dialog (GtkColorButton *button) static void -gtk_color_button_clicked (GtkButton *b) +gtk_color_button_clicked (GtkButton *b, + gpointer user_data) { - GtkColorButton *button = GTK_COLOR_BUTTON (b); + GtkColorButton *button = user_data; GtkColorButtonPrivate *priv = button->priv; /* if dialog already exists, make sure it's shown and raised */ diff --git a/gtk/gtkcolorbutton.h b/gtk/gtkcolorbutton.h index 9ba3a45b43..bed076a096 100644 --- a/gtk/gtkcolorbutton.h +++ b/gtk/gtkcolorbutton.h @@ -52,14 +52,14 @@ typedef struct _GtkColorButtonClass GtkColorButtonClass; typedef struct _GtkColorButtonPrivate GtkColorButtonPrivate; struct _GtkColorButton { - GtkButton button; + GtkWidget parent_instance; /*< private >*/ GtkColorButtonPrivate *priv; }; struct _GtkColorButtonClass { - GtkButtonClass parent_class; + GtkWidgetClass parent_class; void (* color_set) (GtkColorButton *cp); -- 2.30.2